import AnimatedObject from './animated_object';
import DataBus from '../databus';

/**
 * 一次性动画特效类
 * 播放完所有帧后自动回收
 */
export default class OneShotAnimation extends AnimatedObject {
  /**
   * 构造函数
   * @param {string} imgPrefix - 图片路径前缀
   * @param {number} frameCount - 动画总帧数
   * @param {number} width - 物体宽度
   * @param {number} height - 物体高度
   */
  constructor() {
    super('', 0, 0, 0);
    this.loop = false; // 不循环播放
    this.databus = GameGlobal.databus;
  }

  /**
   * 初始化方法
   * 用于对象池复用
   */
  init(imgPrefix, frameCount, width, height, frameInterval = 1, x = 0, y = 0) {
    this.imgPrefix = imgPrefix;
    this.frameCount = frameCount;
    this.width = width;
    this.height = height;
    this.frameInterval = frameInterval;
    this.x = x;
    this.y = y;
    this.currentFrame = 0;
    this.frameCounter = 0;
    this.isPlaying = true;
    this.updateImage();
    return this;
  }

  /**
   * 更新动画帧
   * 播放完所有帧后自动回收
   */
  update() {
    super.update();

    // 检查是否播放完毕
    if (!this.isPlaying && this.currentFrame === this.frameCount - 1) {
      this.recycle();
    }
  }

  /**
   * 回收对象到对象池
   */
  recycle() {
    // 从数据总线中移除
    if (this.databus.animations) {
      const index = this.databus.animations.findIndex(anim => anim === this);
      if (index !== -1) {
        this.databus.animations.splice(index, 1);
      }
    }

    // 重置动画
    this.reset();

    // 归还到对象池
    this.databus.pool.recover('oneShotAnimation', this);
  }

  /**
   * 静态创建方法
   * @param {string} imgPrefix - 图片路径前缀
   * @param {number} frameCount - 动画总帧数
   * @param {number} width - 物体宽度
   * @param {number} height - 物体高度
   * @param {number} x - x坐标
   * @param {number} y - y坐标
   * @returns {OneShotAnimation}
   */
  static create(imgPrefix, frameCount, width, height, x, y, frameInterval = 1) {
    const databus = GameGlobal.databus;
    const anim = databus.pool.getItemByClass('oneShotAnimation', OneShotAnimation);
    anim.init(imgPrefix, frameCount, width, height, frameInterval, x, y);

    // 添加到数据总线管理
    if (!databus.animations) {
      databus.animations = [];
    }
    databus.animations.push(anim);

    return anim;
  }
}